#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string>
#include <cstring>
#include <cmath>
#include <ctime>
#include <algorithm>
#include <utility>
#include <stack>
#include <queue>
#include <vector>
#include <set>
#include <map>
#define PI acos(-1.0)
#define E 1e-9
#define INF 0x3f3f3f3f
#define LL long long
const int MOD = 10007;
const int N = 100000 + 5;
const int dx[] = {-1, 1, 0, 0};
const int dy[] = {0, 0, -1, 1};
using namespace std;
int GCD(int a, int b)
{
    if (b == 0)
        return a;
    return GCD(b, a % b);
}
bool vis[N];
int pythagoras(int n)
{                // 返回n以内本原的毕达哥拉斯个数
    int res = 0; // 本原三元组的个数

    int m = sqrt(n * 1.0);
    for (int i = 1; i <= m; i += 2)
    { // 从1开始，每次+2，保证为奇数
        for (int j = 2; j <= m; j += 2)
        {                      // 从2开始，每次+2，保证为偶数
            int a = max(i, j); // 大的为m
            int b = min(i, j); // 小的为n

            if (GCD(i, j) != 1) // 要求m、n互质
                continue;

            int x = a * a - b * b;
            int y = 2 * a * b;
            int z = a * a + b * b;
            for (int k = 1; k * z <= n; k++)
            { // 标记所有毕达哥拉斯三元组的x、y、z
                vis[x * k] = true;
                vis[y * k] = true;
                vis[z * k] = true;
            }

            if ((a * a + b * b) <= n) // 保证在范围内
                res++;
        }
    }
    return res;
}
int main()
{
    int n;
    while (scanf("%d", &n) != EOF)
    {
        memset(vis, false, sizeof(vis));
        int res1 = pythagoras(n); // 本原的毕达哥拉斯个数
        int res2 = 0;
        for (int i = 1; i <= n; i++) // 枚举所有数
            if (!vis[i])             // 不是毕达哥拉斯三元组
                res2++;

        printf("%d %d\n", res1, res2);
    }
    return 0;
}